package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.bean.ListaConsumos;
import br.com.business.BancoBusiness;
import br.com.business.DescontoParceiroBusiness;
import br.com.business.MeioCapturaBusiness;
import br.com.businesssql.RepasseBusiness;
import br.com.businesssql.TipoCartaoGCardBusiness;
import br.com.businesssql.VendasBusiness;
import br.com.data.DescontoParceiro;
import br.com.data.MeioCaptura;
import br.com.data.Parceiro;
import br.com.datasql.ItemRepasse;
import br.com.datasql.ItemVenda;
import br.com.datasql.ItemVendaRepasse;
import br.com.datasql.TipoCartaoGCard;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.database.data.Criterio;
import br.com.utilidades.faces.SimpleMessageBean;
import constantes.CONSTANTES;

/**
 * @version 1.0.0
 * @since Fevereiro,28 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("session")
public class LojistaGerenciamentoVendasBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = 5122537098061676127L;

    public static final Integer EXTRATO_VENDAS = 1;
    public static final Integer EXTRATO_REPASSES = 2;
    public static final Integer PARAMETROS = 3;

    public static final Integer REPASSE_VISUALIZACAO = 1;
    public static final Integer REPASSE_GRAFICO = 2;
    public static final Integer REPASSE_DETALHADO = 3;

    private SessionUsaPreBean sessionUsaPreBean;

    private Parceiro parceiro;

    private Integer codigoTela;
    private Integer codiogTelaRepasse;

    private Date dataini;
    private Date datafim;

    private String numeroCartao;
    private String nome;

    private List<SelectItem> repasseOpcao;
    private String repasseSelecaoOpcao;
    private Double valorBrutoRepasse;
    private Double taxaTotalRepasse;
    private Double valorLiquidoRepasse;

    private List<ListaConsumos> listasConsumos;
    private Double valorTotal;
    private Integer qtdeTransacoes;
    private Integer qtdeDias;

    private DescontoParceiroBusiness descontoParceiroBusiness;
    private DescontoParceiro descontoParceiro;

    private RepasseBusiness repasseBusiness;
    private VendasBusiness vendasBusiness;
    private TipoCartaoGCardBusiness tipoCartaoGCardBusiness;

    private MeioCapturaBusiness meioCapturaBusiness;

    private List<ItemVenda> itensVendas;
    private List<ItemRepasse> itensRepasses;
    private ItemRepasse itemRepasseSelecionado;

    private List<ItemVendaRepasse> itemVendaRepasse;

    private List<MeioCaptura> meiosCaptura;
    private MeioCaptura meioCaptura;

    private List<TipoCartaoGCard> tiposCartoes;
    private TipoCartaoGCard tipoCartao;

    /**
     * Construtor
     */
    @Autowired
    public LojistaGerenciamentoVendasBean(SessionUsaPreBean sessionUsaPreBean, BancoBusiness bancoBusinessImpl,
	    RepasseBusiness repasseBusiness, VendasBusiness vendasBusiness,
	    TipoCartaoGCardBusiness tipoCartaoGCardBusiness, DescontoParceiroBusiness descontoParceiroBusiness,
	    MeioCapturaBusiness meioCapturaBusiness) {

	this.sessionUsaPreBean = sessionUsaPreBean;

	this.tipoCartaoGCardBusiness = tipoCartaoGCardBusiness;
	this.descontoParceiroBusiness = descontoParceiroBusiness;
	this.meioCapturaBusiness = meioCapturaBusiness;

	this.repasseBusiness = repasseBusiness;
	this.vendasBusiness = vendasBusiness;

	codigoTela = EXTRATO_VENDAS;
	codiogTelaRepasse = REPASSE_VISUALIZACAO;

	parceiro = this.sessionUsaPreBean.getParceiro();

	reset();
    }

    /**
     * reset
     */
    public void reset() {

	Calendar cal = Calendar.getInstance();

	datafim = cal.getTime();

	cal.add(Calendar.MONTH, -1);

	dataini = cal.getTime();

	meioCaptura = new MeioCaptura();
	meioCaptura.setId(-1);
	meioCaptura.setNome("Todos");
	meioCaptura.setSigla("");

	meiosCaptura = new ArrayList<MeioCaptura>();
	List<MeioCaptura> meios = meioCapturaBusiness.buscarPorNomeBusca("");
	meiosCaptura.add(meioCaptura);
	meiosCaptura.addAll(meios);

	repasseOpcao = new ArrayList<SelectItem>();
	repasseOpcao.add(new SelectItem("Todos", "Todos"));
	repasseOpcao.add(new SelectItem("Aberto", "Aberto"));
	repasseOpcao.add(new SelectItem("Fechado", "Fechado"));

	repasseSelecaoOpcao = "Todos";

	nome = "";
	numeroCartao = "";

	listasConsumos = new ArrayList<ListaConsumos>();

	if (parceiro == null) {
	} else {

	    List<Criterio> criterios = new ArrayList<Criterio>();

	    Criterio crit01 = new Criterio();
	    crit01.setCampo("parceiro.id");
	    crit01.setComparacao("=");
	    crit01.setTipo(Criterio.TIPO_INTEGER);
	    crit01.setValue(parceiro.getId());

	    criterios.add(crit01);

	    List<DescontoParceiro> descontos = descontoParceiroBusiness.buscarPorCriterios(criterios, "data DESC ", 1);

	    if (descontos.size() == 0) {
		descontoParceiro = new DescontoParceiro();
	    } else {
		descontoParceiro = descontos.get(0);
	    }

	}

	tiposCartoes = tipoCartaoGCardBusiness.buscarTiposCartao(27);
	tipoCartao = new TipoCartaoGCard();

	buscarVendas();
	buscarRepasses();

    }

    /**
     * buscarRepasses
     */
    public void buscarRepasses() {

	try {

	    if (this.datafim.compareTo(this.dataini) == 0 || this.datafim.compareTo(this.dataini) == 1) {

		Calendar dataInicial = Calendar.getInstance();
		Calendar dataFinal = Calendar.getInstance();

		this.tratarDataBuscaVendas(dataInicial, dataFinal);

		itensRepasses = repasseBusiness.buscarItensRepassePorData(dataInicial.getTime(), dataFinal.getTime(),
			repasseSelecaoOpcao, parceiro.getCodigoGcard());
		// itensRepasses = new ArrayList<ItemRepasse>();

		valorBrutoRepasse = 0d;
		taxaTotalRepasse = 0d;
		valorLiquidoRepasse = 0d;

		int a = 0;
		for (ItemRepasse it : itensRepasses) {

		    valorBrutoRepasse += it.getValorBruto();
		    taxaTotalRepasse += it.getValorTaxaAdministracao();
		    valorLiquidoRepasse += it.getValorLiquido();

		    if (a == 0) {
			a = 1;
			it.setImpar(Boolean.FALSE);
		    } else {
			a = 0;
			it.setImpar(Boolean.TRUE);
		    }

		}

	    } else {
		String msg = super.getMensagem("MN_data_final_maior_inicio");
		enviaMensagem(msg, msg);
	    }

	} catch (Exception e) {
	    enviaMensagem(e.getMessage(), e.getMessage());
	}

    }

    /**
     * detalharRepasse
     */
    public void detalharRepasse() {
	codiogTelaRepasse = REPASSE_DETALHADO;

	try {
	    itemVendaRepasse = repasseBusiness.buscarDetalhamentoRepasse(dataini, datafim);
	} catch (Exception e) {
	    enviaMensagem(e.getMessage(), e.getMessage());
	}

    }

    /**
     * graficoRepasse
     */
    public void graficoRepasse() {
	codiogTelaRepasse = REPASSE_GRAFICO;

    }

    /**
     * imprimirRepasse
     */
    public void imprimirRepasse() {

    }

    /**
     * voltarRepasse
     */
    public void voltarRepasse() {
	codiogTelaRepasse = REPASSE_VISUALIZACAO;

	buscarRepasses();
    }

    /**
     * buscarVendas
     */
    public void buscarVendas() {

	this.listasConsumos = new ArrayList<ListaConsumos>();
	this.valorTotal = 0d;
	this.qtdeTransacoes = 0;
	this.qtdeDias = 0;

	if (this.datafim.compareTo(this.dataini) == 0 || this.datafim.compareTo(this.dataini) == 1) {

	    Calendar dataInicial = Calendar.getInstance();
	    Calendar dataFinal = Calendar.getInstance();

	    this.tratarDataBuscaVendas(dataInicial, dataFinal);

	    String tipo = "";

	    if (this.meioCaptura != null)
		tipo = this.meioCaptura.getSigla();

	    List<ItemVenda> vendas = this.vendasBusiness.buscarVendasPorDataCartao(dataInicial.getTime(),
		    dataFinal.getTime(), this.numeroCartao, this.nome, tipo, this.parceiro.getCodigoGcard());

	    if (vendas.isEmpty()) {
		String msg = super.getMensagem("MN_nenhum_resultado_encontrado");
		enviaMensagem(msg, msg);
	    }

	    for (Date data : this.listaDataVendas(vendas)) {

		List<ItemVenda> listaItemVenda = new ArrayList<ItemVenda>();

		ListaConsumos lt = new ListaConsumos();
		lt.setData(data);

		Double valor = 0d;

		for (ItemVenda itemVenda : vendas) {
		    if (itemVenda.getDataAutorizacao().equals(data)) {

			listaItemVenda.add(itemVenda);

			valor += itemVenda.getValorAutorizacao();
			this.qtdeTransacoes++;
		    }
		}

		lt.setItensVendas(listaItemVenda);
		lt.setValorDia(valor);

		this.valorTotal += valor;
		this.listasConsumos.add(lt);
	    }
	} else {
	    String msg = super.getMensagem("MN_data_final_maior_inicio");
	    enviaMensagem(msg, msg);
	}

    }

    /**
     * <p>
     * Método responsável por tratar as datas para parâmetros da consulta de
     * vendas
     * <p>
     * 
     * @param dataInicial
     * @param dataFinal
     * @author Waltenes Junior
     */
    private void tratarDataBuscaVendas(Calendar dataInicial, Calendar dataFinal) {

	dataInicial.setTime(dataini);
	dataFinal.setTime(datafim);

	dataInicial.add(Calendar.DAY_OF_MONTH, 1);
	dataInicial.set(Calendar.HOUR_OF_DAY, 0);
	dataInicial.set(Calendar.MINUTE, 0);
	dataInicial.set(Calendar.SECOND, 0);
	dataInicial.set(Calendar.MILLISECOND, 0);

	dataFinal.add(Calendar.DAY_OF_MONTH, 1);
	dataFinal.set(Calendar.HOUR_OF_DAY, 23);
	dataFinal.set(Calendar.MINUTE, 59);
	dataFinal.set(Calendar.SECOND, 59);
	dataFinal.set(Calendar.MILLISECOND, 999);
    }

    /**
     * <p>
     * Método responsável por receber uma lista de vendas e devolver uma lista
     * de datas das vendas
     * <p>
     * 
     * @param listaItens
     * @return Collection<Date> coleção de datas das vendas entre o periodo
     *         selecionado
     * @author Waltenes Junior
     */
    private Collection<Date> listaDataVendas(List<ItemVenda> listaItens) {

	Collection<Date> listaRetorno = new ArrayList<Date>();

	for (ItemVenda venda : listaItens) {
	    if (!listaRetorno.contains(venda.getDataAutorizacao())) {
		listaRetorno.add(venda.getDataAutorizacao());
	    }
	}

	return listaRetorno;
    }

    /**
     * atualizarParametros
     */
    public void atualizarParametros() {

    }

    /**
     * imprimir
     */
    public void imprimir() {

    }

    /**
     * extratoVendas
     */
    public void extratoVendas() {
	codigoTela = EXTRATO_VENDAS;
	try {
	    FacesContext.getCurrentInstance().getExternalContext()
		    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaGerenciamentoVendasRepassesExtratoVendas.jsf");
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }

    /**
     * extratoRepasses
     */
    public void extratoRepasses() {
	codigoTela = EXTRATO_REPASSES;
	try {
	    FacesContext.getCurrentInstance().getExternalContext()
		    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaGerenciamentoVendasRepassesExtratoRepasses.jsf");
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }

    /**
     * parametros
     */
    public void parametros() {
	codigoTela = PARAMETROS;
	try {
	    FacesContext.getCurrentInstance().getExternalContext()
		    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaGerenciamentoVendasRepassesParametros.jsf");
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }

    public boolean isBuscaNome() {
	if (nome.equals(""))
	    return Boolean.FALSE;
	return Boolean.TRUE;
    }

    public boolean isBuscaNumero() {
	if (numeroCartao.equals(""))
	    return Boolean.FALSE;
	return Boolean.TRUE;
    }

    public boolean isTelaExtratoVendas() {
	if (codigoTela == EXTRATO_VENDAS)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaExtratoRepasses() {
	if (codigoTela == EXTRATO_REPASSES)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaParametros() {
	if (codigoTela == PARAMETROS)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaRepasseVisualizacao() {
	if (codiogTelaRepasse == REPASSE_VISUALIZACAO)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaRepasseGrafico() {
	if (codiogTelaRepasse == REPASSE_GRAFICO)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaRepasseDetalhado() {
	if (codiogTelaRepasse == REPASSE_DETALHADO)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    // SETS AND GETS
    public Parceiro getParceiro() {
	return parceiro;
    }

    public void setParceiro(Parceiro parceiro) {
	this.parceiro = parceiro;
    }

    public Date getDataini() {
	return dataini;
    }

    public void setDataini(Date dataini) {
	this.dataini = dataini;
    }

    public Date getDatafim() {
	return datafim;
    }

    public void setDatafim(Date datafim) {
	this.datafim = datafim;
    }

    public String getNumeroCartao() {
	return numeroCartao;
    }

    public void setNumeroCartao(String numeroCartao) {
	this.numeroCartao = numeroCartao;
    }

    public String getNome() {
	return nome;
    }

    public void setNome(String nome) {
	this.nome = nome;
    }

    public List<ListaConsumos> getListasConsumos() {
	return listasConsumos;
    }

    public void setListasConsumos(List<ListaConsumos> listasConsumos) {
	this.listasConsumos = listasConsumos;
    }

    public Double getValorTotal() {
	return valorTotal;
    }

    public void setValorTotal(Double valorTotal) {
	this.valorTotal = valorTotal;
    }

    public Integer getQtdeTransacoes() {
	return qtdeTransacoes;
    }

    public void setQtdeTransacoes(Integer qtdeTransacoes) {
	this.qtdeTransacoes = qtdeTransacoes;
    }

    public Integer getQtdeDias() {
	return qtdeDias;
    }

    public void setQtdeDias(Integer qtdeDias) {
	this.qtdeDias = qtdeDias;
    }

    public List<SelectItem> getRepasseOpcao() {
	return repasseOpcao;
    }

    public void setRepasseOpcao(List<SelectItem> repasseOpcao) {
	this.repasseOpcao = repasseOpcao;
    }

    public String getRepasseSelecaoOpcao() {
	return repasseSelecaoOpcao;
    }

    public void setRepasseSelecaoOpcao(String repasseSelecaoOpcao) {
	this.repasseSelecaoOpcao = repasseSelecaoOpcao;
    }

    public DescontoParceiro getDescontoParceiro() {
	return descontoParceiro;
    }

    public void setDescontoParceiro(DescontoParceiro descontoParceiro) {
	this.descontoParceiro = descontoParceiro;
    }

    public List<ItemVenda> getItensVendas() {
	return itensVendas;
    }

    public void setItensVendas(List<ItemVenda> itensVendas) {
	this.itensVendas = itensVendas;
    }

    public List<ItemRepasse> getItensRepasses() {
	return itensRepasses;
    }

    public void setItensRepasses(List<ItemRepasse> itensRepasses) {
	this.itensRepasses = itensRepasses;
    }

    public Double getValorBrutoRepasse() {
	return valorBrutoRepasse;
    }

    public void setValorBrutoRepasse(Double valorBrutoRepasse) {
	this.valorBrutoRepasse = valorBrutoRepasse;
    }

    public Double getTaxaTotalRepasse() {
	return taxaTotalRepasse;
    }

    public void setTaxaTotalRepasse(Double taxaTotalRepasse) {
	this.taxaTotalRepasse = taxaTotalRepasse;
    }

    public Double getValorLiquidoRepasse() {
	return valorLiquidoRepasse;
    }

    public void setValorLiquidoRepasse(Double valorLiquidoRepasse) {
	this.valorLiquidoRepasse = valorLiquidoRepasse;
    }

    public ItemRepasse getItemRepasseSelecionado() {
	return itemRepasseSelecionado;
    }

    public void setItemRepasseSelecionado(ItemRepasse itemRepasseSelecionado) {
	this.itemRepasseSelecionado = itemRepasseSelecionado;
    }

    public Integer getCodiogTelaRepasse() {
	return codiogTelaRepasse;
    }

    public void setCodiogTelaRepasse(Integer codiogTelaRepasse) {
	this.codiogTelaRepasse = codiogTelaRepasse;
    }

    public List<ItemVendaRepasse> getItemVendaRepasse() {
	return itemVendaRepasse;
    }

    public void setItemVendaRepasse(List<ItemVendaRepasse> itemVendaRepasse) {
	this.itemVendaRepasse = itemVendaRepasse;
    }

    public List<MeioCaptura> getMeiosCaptura() {
	return meiosCaptura;
    }

    public void setMeiosCaptura(List<MeioCaptura> meiosCaptura) {
	this.meiosCaptura = meiosCaptura;
    }

    public MeioCaptura getMeioCaptura() {
	return meioCaptura;
    }

    public void setMeioCaptura(MeioCaptura meioCaptura) {
	this.meioCaptura = meioCaptura;
    }

    public List<TipoCartaoGCard> getTiposCartoes() {
	return tiposCartoes;
    }

    public void setTiposCartoes(List<TipoCartaoGCard> tiposCartoes) {
	this.tiposCartoes = tiposCartoes;
    }

    public TipoCartaoGCard getTipoCartao() {
	return tipoCartao;
    }

    public void setTipoCartao(TipoCartaoGCard tipoCartao) {
	this.tipoCartao = tipoCartao;
    }

}
